// Point.h
#include <iostream>
using namespace std;

/**
 * 1. 使用 friend 关键字声明外部函数为友元函数
 * 2. 友元函数内可以访问类中所有成员（私有成员）
 * 3. 声明友元函数时不受权限关键字限制，可以在类任何位置
*/
class Point
{
    // 声明友元全局函数
    friend void printPoint(const Point &p);
public:
    Point(double x, double y);
    ~Point();
private:
    double x;
    double y;
};

Point::Point(double x, double y) : x(x), y(y)
{
    cout << "Point()" << endl;
}

Point::~Point()
{
    cout << "~Point()" << endl;
}

// 全局函数
void printPoint(const Point &p)
{
    // 由于在 Point 类中声明为友元函数，所以可以直接访问类中成员
    cout << "Point(" << p.x << ", " << p.y << ")\n";
}

int main()
{
    // 实例化 Point 对象
    Point p(3, 4);

    // 通过全局函数可以直接访问
    printPoint(p);

    return 0;
}